<?php
/**
 * 캐쉬 설정
 *
 * <code>
 * // 캐쉬 설정
 * $aCacheConfig = array
 * (
 *     $aCacheConfig['ExpireTime'] = 86400,           // 캐쉬 유료 시간
 *     $aCacheConfig['Writer'] = 'File',    // 캐쉬 쓰기 처리자(File)
 *     $aCacheConfig['WriterParser'] = 'Serial',    // 캐쉬 쓰기 파서(Serial)
 *     $aCacheConfig['CacheManage'] = 'File',    // 캐쉬 관리 (File, Filememcache)
 *     $aCacheConfig['UseCache'] = false,    // 캐쉬 사용여부(사용:true|사용안함:false)
 *     $aCacheConfig['DefaultPath'] = FW_DIR_CACHE,    // 캐쉬 경로
 *     $aCacheConfig['DirectoryVariance'] = 0    // 캐쉬 분산(디렉토리 또는 키 분산)
 *      $aCacheConfig['MemcacheHost'] = 'localhost'     // 맴캐시 호스트 주소 (CacheManage 설정이 Filememcache 일 경우 유효함)
 *      $aCacheConfig['MemcachePort'] = 11211           // 맴캐시 포트 주소 (CacheManage 설정이 Filememcache 일 경우 유효함)
 * );
 *
 * $utilCacheConfig = utilCacheConfig::getInstance('SAMPLE', $aCacheConfig);
 *
 * or
 *
 * // 기존 설정을 반환하거나 기본 설정 반환
 * $utilCacheConfig = utilCacheConfig::getInstance('SAMPLE');
 * </code>
 *
 * @package util
 * @subpackage cache
 *
 * @author jylee3@simplexi.com
 * @version 1.0
 */
class utilCacheConfig
{
    /**
     * 캐쉬 이름
     * @var Array
     */
    public static $aCacheName = array();

    /**
     * 캐쉬 이름
     * @var String
     */
    public $sCacheName;

    /**
     * 캐쉬 만료시간
     * @var Integer
     */
    public $iExpireTime;

    /**
     * 캐쉬 쓰기(File, ...)
     * @var String
     */
    public $sWriter;

    /**
     * 캐쉬 쓰기 파서(JSON, ...)
     * @var String
     */
    public $sWriterParser;

    /**
     * 캐쉬 관리(File, Filememcache)
     * @var String
     */
    public $sManage;

    /**
     * 캐쉬 사용여부
     * @var Boolean
     */
    public $bUseCache;

    /**
     * 캐쉬 기본 경로
     * @var String
     */
    public $sDefaultPath;

    /**
     * 캐쉬 디렉토리 분산
     * @var Integer    // 0~15
     */
    public $iDirectoryVariance;

    /**
     * Memcache 호스트
     * @var String
     */
    public $sMemcacheHost;

    /**
     * Memcache 포트
     * @var String
     */
    public $sMemcachePort;

    public static function getInstance($sCacheName='_DEFAULT_', $aCacheConfig=array())
    {
        if (!self::$aCacheName[$sCacheName] instanceof utilCacheConfig) {
            self::$aCacheName[$sCacheName] = new utilCacheConfig($sCacheName);
            self::$aCacheName[$sCacheName]->setConfig($aCacheConfig);
        } else if (!empty($aCacheConfig)) {
            self::$aCacheName[$sCacheName]->setConfig($aCacheConfig);
        }

        return self::$aCacheName[$sCacheName];
    }

    /**
     * 캐쉬 설정 생성자
     * @param    Array    $sCacheName    캐쉬 이름
     *
     * @return    utilCacheConfig
     */
    public function __construct($sCacheName)
    {
        $this->sCacheName = $sCacheName;
    }

    /**
     * 캐쉬 설정
     *
     * @param    Array    $aCacheOption    캐쉬 설정
     */
    public function setConfig($aCacheConfig)
    {
        isset($aCacheConfig['ExpireTime'])? $this->setExpireTime($aCacheConfig['ExpireTime']) : $this->setExpireTime();
        isset($aCacheConfig['Writer'])? $this->setWriter($aCacheConfig['Writer']) : $this->setWriter();
        isset($aCacheConfig['WriterParser'])? $this->setWriterParser($aCacheConfig['WriterParser']) : $this->setWriterParser();
        isset($aCacheConfig['CacheManage'])? $this->setCacheManage($aCacheConfig['CacheManage']) : $this->setCacheManage();
        isset($aCacheConfig['UseCache'])? $this->setUseCache($aCacheConfig['UseCache']) : $this->setUseCache();
        isset($aCacheConfig['DefaultPath'])? $this->setDefaultPath($aCacheConfig['DefaultPath']) : $this->setDefaultPath();
        isset($aCacheConfig['DirectoryVariance'])? $this->setDirectoryVariance($aCacheConfig['DirectoryVariance']) : $this->setDirectoryVariance();
        isset($aCacheConfig['MemcacheHost']) ? $this->setMemcacheHost($aCacheConfig['MemcacheHost']) : $this->setMemcacheHost();
        isset($aCacheConfig['MemcachePort']) ? $this->setMemcachePort($aCacheConfig['MemcachePort']) : $this->setMemcachePort();

        return $this;
    }

    /**
     * 캐쉬 만료시간 설정
     *
     * @param    Integer    $iExpireTime
     *
     * @return    utilCacheConfig
     */
    public function setExpireTime($iExpireTime=86400)
    {
        if (!is_int($iExpireTime))    throw new exceptionRuntime('Cache Configration Failed.');

        $this->iExpireTime = $iExpireTime;

        return $this;
    }

    /**
     * 캐쉬 쓰기 설정
     *
     * @param    String    $sWriter
     *
     * @return    utilCacheConfig
     */
    protected function setWriter($sWriter='File')
    {
        if (!is_string($sWriter))    throw new exceptionRuntime('Cache Configration Failed.');

        $this->sWriter = $sWriter;

        return $this;
    }

    /**
     * 캐쉬 쓰기 파서 설정
     *
     * @param    String    $sWriterParser
     *
     * @return     utilCacheConfig
     */
    protected function setWriterParser($sWriterParser='Serial')
    {
        if (!is_string($sWriterParser))    throw new exceptionRuntime('Cache Configration Failed.');

        $this->sWriterParser = $sWriterParser;

        return $this;
    }

    /**
     * 캐쉬 관리 설정
     *
     * @param    String    $sCacheManage
     *
     * @return    utilCacheConfig
     */
    protected function setCacheManage($sCacheManage='File')
    {
        if (!is_string($sCacheManage))    throw new exceptionRuntime('Cache Configration Failed.');

        $this->sManage = $sCacheManage;

        return $this;
    }

    /**
     * 캐쉬 사용여부 설정
     *
     * @param    Boolean    $bUseCache
     *
     * @return    utilCacheConfig
     */
    public function setUseCache($bUseCache=false)
    {
        if (!is_bool($bUseCache))    throw new exceptionRuntime('Cache Configration Failed.');

        $this->bUseCache = $bUseCache;

        return $this;
    }

    /**
     * 캐쉬 기본 디렉토리 설정
     *
     * @param    String    $sPath
     *
     * @return utilCacheConfig
     */
    public function setDefaultPath($sPath=FW_DIR_CACHE)
    {
        if (!is_string($sPath))    throw new exceptionRuntime('Cache Configration Failed.');

        if (!empty($sPath)) {
            $this->sDefaultPath = $sPath;
        }

        return $this;
    }

    /**
     * 캐쉬 디렉토리 분산 설정
     *
     * @param    Integer    $iVariance
     *
     * @return     utilCacheConfig
     */
    public function setDirectoryVariance($iVariance=0)
    {
        if (!is_int($iVariance))    throw new exceptionRuntime('Cache Configration Failed.');

        if($iVariance>15)    $iVariance = 15;

        $this->iDirectoryVariance = $iVariance;

        return $this;
    }

    /**
     * Memcache 호스트 설정
     *
     * @param string $sHost
     */
    private function setMemcacheHost($sHost='localhost')
    {
        $this->sMemcacheHost = $sHost;
    }

    /**
     * Memcache 포트 설정
     *
     * @param string $sPort
     */
    private function setMemcachePort($sPort=11211)
    {
        $this->sMemcachePort = $sPort;
    }
}
